import scrapy
from projectdemo.items import BookItem


class SpiderdemoSpider(scrapy.Spider):
    name = 'spiderdemo'
    allowed_domains = ['book.douban.com']
    # 注意起始页的差异.起始页就是爬虫启动时抓取的入口页.此页很关键,决定了parse函数解析的内容.
    start_urls = ['https://book.douban.com/tag']  # 获取到的是整个大类的tag页面.

    # def start_requests(self):
    #     """
    #     这个函数是 spider默认的入口函数.如果不重写的话,spider会从start_urls 的地址开始进行爬取.
    #     :return:
    #     """
    #     pass

    def parse(self, response):
        """
        这个是爬虫内置的函数,爬虫抓取起始页的页面后,在这里做解析.
        请确保我们获取需要的数据后,做yield返回处理.
        # 我们获取到response使用xpath解析时,得到的是selector对象.
        # extract()方法提取的就是字符串. xpath提取的是selector对象.
        # xpath对象支持继续使用xpath进行解析.
        :param response: 这个是传递过来的页面数据.
        """
        # 获取到大类页面,我们在此页面进行提取,提取我们关注的小类入口.
        item_list = response.xpath(".//div[@class='article']/div[2]/div[6]/table")
        # item_list = response.xpath(".//div[@class='article']/div[2]/div[6]/table")
        # 遍历小类列表,这个列表是有上面的xpath获取的.
        for item in item_list:
            """
            因为item_list获取时,未做extract转字符串,所以实际item对象是 xpath的selector对象.
            """
            # 解析的是大类的列表信息,获取小类入口地址. 比如,我们获取 文学(大类)--> 小说(小类) 的入口.
            # 获取每个小类的链接 (需要转换成str,因为函数的入参 url不识别selector对象)
            # 这个获取的是单个大类中所有小类的列表.所以是一个数组.
            tags_list = item.xpath(".//td/a/@href").extract()
            for tag in tags_list:
                url_tag_page = "https://book.douban.com" + tag
                # 将获取到的每个小类入口,再次传入到scrapy中,进行爬取.
                # 指定回调函数,获取到对应的页面后,会调用callback函数进行解析.
                yield scrapy.Request(url=url_tag_page,
                                     callback=self.parse_tag)

    def parse_tag(self, response):
        """
        # 爬取到的是小类列表
        :param response:
        :return:
        """
        print(response)
        # 判断是否有下一页
        # 此时返回的是一个列表 list对象
        next_page = response.xpath(".//div[@class='paginator']/span[@class='next']/a/@href").extract()
        if next_page :
            # 判断列表是否为空,如果不为空,说明是有下一页的. 获取下一页的按钮.
            url_next_page = "https://book.douban.com"+next_page[0]
            print(url_next_page)
            # 将获取到的url放到爬虫中.并指定回调处理函数.
            yield scrapy.Request(url=url_next_page,
                                 callback=self.parse_tag)

        # 获取当前列表页的元素.
        item_list = response.xpath(".//li[@class='subject-item']")
        for item in item_list:
            # 解析列表信息,获取详情页.
            url_item = item.xpath(".//div[@class='info']/h2/a/@href").extract()[0]
            print(url_item)
            yield scrapy.Request(url_item,
                                 callback=self.parse_item)

    def parse_item(self, response):
        """
        详情页解析
        :param response:
        :return:
        """
        bookitem = BookItem()
        bookitem['bookname'] = response.xpath(".//div[@id='wrapper']/h1/span/text()").extract()[0]
        bookitem['score'] = response.xpath(".//div[@class='subjectwrap clearfix']/div[2]//strong/text()").extract()[0]
        bookitem['author'] = response.xpath(".//div[@id='info']/span[1]/a/text()").extract()[0]

        # bookitem['pubdate'] = response.xpath(".//div[@id='info']/text()[9]").extract()[0] # 有问题
        # bookitem['isbn'] = response.xpath(".//div[@id='info']/text()[19]").extract()[0] # 有问题
        yield bookitem